laravel框架学习(04):生命周期

您所在的位置:网站首页 laravel 框架生命周期 laravel框架学习(04):生命周期

laravel框架学习(04):生命周期

2023-12-26 15:51| 来源: 网络整理| 查看: 265

这里将看看laravel执行的流程。

一.入口文件

Laravel 应用的所有请求入口都是 public/index.php 文件。

index.php里面其实就几行代码。

// 1.定义个laravel开始时间的常量,微秒数 define('LARAVEL_START', microtime(true)); // 2.注册自动加载程序,Composer里面的 require __DIR__.'/../vendor/autoload.php'; // 3.开始启动框架,创建一个app应用程序,并加载一些应用支持,得到$app变量返回(具体加载的东西可以打印$app看看) $app = require_once __DIR__.'/../bootstrap/app.php'; // 4.make()是用来创建实例用的,这里创建一个http内核类的实例,这里需要处理http请求 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); // 5.处理传入的HTTP请求,返回Response (http内核的方法,更多可以查看上面的类) $response = $kernel->handle( // 从服务器变量创建一个新的Illuminate HTTP请求。 $request = Illuminate\Http\Request::capture() ); // 6.send方法发送至浏览器 $response->send(); // 7.执行请求生命周期的所有最终操作 $kernel->terminate($request, $response);

1.定义个laravel开始时间的常量,微秒数 define('LARAVEL_START', microtime(true)); 2.注册自动加载程序,Composer里面的 require __DIR__.'/../vendor/autoload.php'; 3.开始启动框架,创建一个app应用程序,并加载一些应用支持,得到$app变量返回(具体加载的东西可以打印$app看看) $app = require_once __DIR__.'/../bootstrap/app.php'; 4.make()是用来创建实例用的,这里创建一个http内核类的实例,这里需要处理http请求 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);5.处理传入的HTTP请求,返回Response (http内核的方法,更多可以查看上面的类) $response = $kernel->handle(     // 从服务器变量创建一个新的Illuminate HTTP请求。     $request = Illuminate\Http\Request::capture() );6.send方法发送至浏览器 $response->send();7.执行请求生命周期的所有最终操作 $kernel->terminate($request, $response);

完整的一次生命周期就是这7步骤。有同学就好奇了,感觉啥都没做,加载了一些东西,返回了个Response 就结束了,中间件,服务注册那些东西在哪?别急,往下看。

二、看看每步都做了啥?

1.定义个laravel开始时间的常量,微秒数 define('LARAVEL_START', microtime(true)); 

作用:计算程序执行时间:截止时间 - 启动时间 = 程序执行时间

2.注册自动加载程序,Composer里面的 require __DIR__.'/../vendor/autoload.php'; 里面的内容:

// 1.加载composer真正的文件 require_once __DIR__ . '/composer/autoload_real.php'; // 2.调用getLoader()方法,返回加载的结果 $loader return ComposerAutoloaderInitbc82a5a36625504801b4b3fcf46ffd8f::getLoader();

 (1)Composer自动加载初始(版本),看类名见名知意,详细解析请看注释。

ComposerAutoloaderInitxxxxx::getLoader();

/** * @return \Composer\Autoload\ClassLoader */ public static function getLoader() { // 1.返回一个单例,只实例化一次(单例模式) if (null !== self::$loader) { return self::$loader; } // 将函数注册到SPL __autoload函数队列中。如果该队列中的函数尚未激活,则激活它们。需要用到一个类的时候,就会调用 loadClass 方法。 spl_autoload_register(array('ComposerAutoloaderInitbc82a5a36625504801b4b3fcf46ffd8f', 'loadClassLoader'), true, true); // new 一个Composer\Autoload\ClassLoader实例 self::$loader = $loader = new \Composer\Autoload\ClassLoader(); // 注销已注册的 __autoload() 函数 spl_autoload_unregister(array('ComposerAutoloaderInitbc82a5a36625504801b4b3fcf46ffd8f', 'loadClassLoader')); // 判断是否用静态加载(php版本id>=50600&&...) $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require_once __DIR__ . '/autoload_static.php'; //调用autoload_static.php的getInitializer($loader)方法,给$loader设置各种变量。 call_user_func(\Composer\Autoload\ComposerStaticInitbc82a5a36625504801b4b3fcf46ffd8f::getInitializer($loader)); } else { //获取完整的命名空间和文件目录的映射,循环set给$loader $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } //获取PSR4 标准顶级命名空间映射数组,循环set给$loader $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } // 命名空间初始化,命名空间映射,add给loader $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } // spl_autoload_register(array($this, 'loadClass'), true, $prepend);将此实例注册为自动装弹器,给定函数注册为__autolload()实现,需要用到一个类的时候,就会调用 loadClass 方法。 $loader->register(true); // 加载全局函数,把全局函数写到特定的文件,循环加载文件 if ($useStaticLoader) { // 静态初始化文件 $includeFiles = Composer\Autoload\ComposerStaticInitbc82a5a36625504801b4b3fcf46ffd8f::$files; } else { // 普通初始化文件 $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { //加载全局函数 composerRequirebc82a5a36625504801b4b3fcf46ffd8f($fileIdentifier, $file); } // 加载完成,返回结果 return $loader; }

(2)这几个文件的内容 

1)autoload_static.php:里面塞了一堆数组,数组里面就是那些composer依赖类了

public static $files = array ( 'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', //...省N行 ) public static $prefixDirsPsr4 = array ( 'voku\\' => array ( 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku', ), //...省N行 ) public static $prefixesPsr0 = array ( 'M' => array ( 'Mockery' => array ( 0 => __DIR__ . '/..' . '/mockery/mockery/library', ), ), ); public static $classMap = array ( 'App\\Console\\Kernel' => __DIR__ . '/../..' . '/app/Console/Kernel.php', 'App\\Exceptions\\Handler' => __DIR__ . '/../..' . '/app/Exceptions/Handler.php', //...省N行 ) public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInitbc82a5a36625504801b4b3fcf46ffd8f::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInitbc82a5a36625504801b4b3fcf46ffd8f::$prefixDirsPsr4; $loader->prefixesPsr0 = ComposerStaticInitbc82a5a36625504801b4b3fcf46ffd8f::$prefixesPsr0; $loader->classMap = ComposerStaticInitbc82a5a36625504801b4b3fcf46ffd8f::$classMap; }, null, ClassLoader::class); }

2).autoload_namespaces.php,加载vendor文件夹下的一些文件



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3